第二章:7 撰寫布林通道突破策略


Posted by nightqwq on 2021-12-11

上一節,我們成功用一行程式碼撰寫策略。

這一節,我們在試著用 Talib 撰寫布林通道突破的策略。


a. 什麼是布林通道突破?

布林通道是一種判斷「進出場時機」的指標,用平均線與機率的觀念找出市場多空訊號。

如圖,當價格突破 Upperband 時,進行買入,時,跌破 lowerband 時,進行賣出。

b. 策略撰寫

只要依照上圖的程式碼文件和布林通道的說明,相信現在以大家的實力也能夠輕易寫出來,這邊一樣先給程式碼:

bbands_strategy = TalibStrategy(
    'BBANDS',

    lambda ohlcv, bb: crossover(ohlcv.close, bb.upperband),

    lambda ohlcv, bb: crossunder(ohlcv.close, bb.lowerband),
)

bbands_strategy.backtest(ohlcv, variables = {'timeperiod': 50}, freq = '1h', plot = True)

由圖可以看出布林通道,並且在價格突破紅色線段(Upperband)時確實有進行買入,也確實在跌破 lowerband 時進行賣出。

這樣簡潔的寫法,其實也可以用來撰寫其他 Filters,我們現在就來試試看。

先移動到「Talib Filter Wrapper」觀看下方的技術文件:

如圖,參數和輸出各只有一個。

往下開一個新儲存格,按照上面的方式撰寫,寫入收盤價和參數:

talib.LINEARREG_ANGLE(ohlcv.close, timeperiod = 14)

如圖,我們希望指標大於 0 時進場。(因為時間很長,所以看起來很密集)

往下開一個新儲存格,導入 TalibFilter:

from finlab_crypto.talib_filter import TalibFilter

撰寫 lambda:

line_angle_filter = TalibFilter(
    'LINEARREG_ANGLE',

    lambda ohlcv, angle: angle > 0
)

lambda 撰寫完畢,接著往下開一個新儲存格,創建這個 Filter:

f14 = line_angle_filter.create({'timeperiod': 14})

可以導入歷史價格來看看這個 Filter:

(True 代表有進場,False 代表沒有)

好了,既然有 Strategy,也有了 Filter,接下來就是要將這兩者做結合,去產生出新的策略。

先移動到「Combine talib strategy and filter」這邊,將製作好的 Filter 貼到「macd_strategy」這個變數下方。

再來就是做回測,於該儲存格最下方撰寫

macd_vars = {}

macd_strategy.show_parameters()

然後執行,將跑出來的結果複製貼上到空字串裡面,並去除進出場點的參數,以及去除最後一行,這樣空字典的部分就會是:

macd_vars = { 'fastperiod': 12, 
              'slowperiod': 26, 
              'signalperiod': 9}

再來於空字典上方導入 numpy,再把前兩個參數改成 arange,已進行最佳化,再把最後一個參數從 9 改成 10:

macd_vars = { 'fastperiod': np.arange(20, 120, 10), 
              'slowperiod': np.arange(20, 120, 10), 
              'signalperiod': 10}

最後於該儲存格最下方輸入下列程式碼,即可進行回測:

macd_strategy.backtest(ohlcv, variables = macd_vars, freq = '1h', plot = True)

整個程式碼會是這樣:

from finlab_crypto.talib_strategy import TalibStrategy

from finlab_crypto.talib_filter import TalibFilter

macd_strategy = TalibStrategy(
    'MACD',

    lambda ohlcv, macd: crossover(macd.macdhist, 0),

    lambda ohlcv, macd: crossunder(macd.macdhist, 0),
)


line_angle_filter = TalibFilter(
    'LINEARREG_ANGLE',

    lambda ohlcv, angle: angle > 0
)

import numpy as np

macd_vars = { 'fastperiod': np.arange(20, 120, 10), 
              'slowperiod': np.arange(20, 120, 10), 
              'signalperiod': 10}

macd_strategy.backtest(ohlcv, variables = macd_vars, freq = '1h', plot = True)

可以看到跑出來的績效不是太好,最多只到 300,可以更改參數範圍區間試試看:

macd_vars = {
             'fastperiod': np.arange(200, 400, 10), 
             'slowperiod': np.arange(200, 400, 10), 
             'signalperiod': 10}

績效成功提升到 2000 左右。

(如果你在這時候 RAM 耗盡的話,不用慌,cloud 會自動幫你重置,這時你只需要由上往下重跑一遍即可,不然就是只跑你需要的儲存格。)

其實我們在裡面寫上的 Filter 還沒有被正式啟用,所以現在就讓我們把它加入回測參數裡面。

其實與以前所學到的類似,加入完後會像這樣:

# macd_strategy
# line_angle_filter
from finlab_crypto.talib_strategy import TalibStrategy
from finlab_crypto.talib_filter import TalibFilter

def crossover(s1, s2):
  if isinstance(s2, numbers.Number):
    return (s1 > s2) & (s1.shift() < s2)
  return (s1 > s2) & (s1.shift() < s2.shift())

def crossunder(s1, s2):
  if isinstance(s2, numbers.Number):
    return (s1 < s2) & (s1.shift() > s2)
  return (s1 < s2) & (s1.shift() > s2.shift())

macd_strategy = TalibStrategy(
    'MACD', 
    lambda ohlcv, macd: crossover(macd.macdhist, 0), 
    lambda ohlcv, macd: crossunder(macd.macdhist, 0), 
)

line_angle_filter = TalibFilter(
    'LINEARREG_ANGLE',
    lambda ohlcv, angle: angle > 0
)

import numpy as np
macd_vars = {
             'fastperiod': np.arange(200, 400, 10), 
             'slowperiod': np.arange(200, 400, 10), 
             'signalperiod': 10}

angle_vars = {'timeperiod': np.arange(20, 100, 10)}

macd_strategy.backtest(ohlcv, variables=macd_vars,
                       filters={'line_angle': line_angle_filter.create(angle_vars)},
                       freq='1h', plot=True)

再來,我們複製倒數三行程式碼並貼上新儲存格,取其中的最佳策略(由上往下越佳)來創建回測可視化圖表:

macd_vars = {
             'fastperiod': 300, 
             'slowperiod': 390, 
             'signalperiod': 10}

angle_vars = {'timeperiod': 20}

macd_strategy.backtest(ohlcv, variables=macd_vars,
                       filters={'line_angle': line_angle_filter.create(angle_vars)},
                       freq='1h', plot = True)


這一節,我們成功撰寫布林通道突破策略,並且嘗試用不同的 filters 寫 lambda。

下一章,我們來針對基本面與籌碼面撰寫策略。

完整版程式碼連結:https://colab.research.google.com/drive/108kx9nAsefqdDfFc_n2ISEablT9SRNbD?usp=sharing


#加密貨幣 #Python







Related Posts

day01 安裝android studio + 認識adb

day01 安裝android studio + 認識adb

Jump Diffusion Option Valuation in  Discrete Time

Jump Diffusion Option Valuation in Discrete Time

What Type of Laser Engraving Machine Should be Used for Stainless Steel Engraving?

What Type of Laser Engraving Machine Should be Used for Stainless Steel Engraving?


Comments